﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using Conexion;
using System.IO;
using System.Windows.Forms;
using System.Drawing;

namespace Admin
{
    class RequestManager
    {
        private const string CMD_AGREGAR = "01";
        private const string CMD_QUITAR = "02";
        public AdminForm ventana = null;
        private Config conf = null;

        public RequestManager(Config conf, AdminForm form)
        {
            this.conf = conf;
            this.ventana = form;
        }      

        public void ConsultarManager(string comando)
        {
            try
            {
                Label lbl = null;
                if (comando.Equals(CMD_AGREGAR))
                {
                    lbl = (Label)ObtenerControl("lblResultado");
                }
                else
                {
                    lbl = (Label)ObtenerControl("lblResultado2");
                }

                lbl.Text = "Estableciendo conexión..";

                TcpClient cliente = ClientTCP.obtenerTcpClient(conf.Ip_manager, conf.Puerto_manager);
                string cmd = CrearComando(comando);
                bool exito = false;

                lbl.Text = "Enviando datos..";
                StreamWriter str = new StreamWriter(cliente.GetStream());
                str.Write(cmd);
                str.Flush();

                string hdr = "";
                NetworkStream ns;
                byte[] datos = new byte[1024];

                lbl.Text = "Esperando respuesta..";
                ns = cliente.GetStream();

                lbl.Text = "Procesando respuesta..";

                ns.Read(datos, 0, 3);
                hdr = Encoding.UTF8.GetString(datos).Substring(0, 3);

                if (hdr.Equals("RES"))
                {
                    ns.Read(datos, 0, 2);
                    string cmdRecibido = Encoding.UTF8.GetString(datos).Substring(0, 2);

                    if (cmdRecibido.Equals(comando))
                    {
                        ns.Read(datos, 0, 1);
                        exito = (Encoding.UTF8.GetString(datos).Substring(0, 1).Equals("0"));
                        if (exito)
                        {
                            lbl.ForeColor = Color.Green;
                            lbl.Text = "Exito";
                        }
                        else
                        {
                            lbl.ForeColor = Color.Red;
                            lbl.Text = "Error";
                        }
                    }
                    else
                    {
                        //error throw ex
                    }
                }
            }
            catch (Exception)
            {
                MessageBox.Show("No se pudo realizar conexion con el manager");
            }

        }

        private string CrearComando(string cmd)
        {
            string comando = "REQ";
            switch (cmd)
            {
                case CMD_AGREGAR:
                    {
                        comando += CMD_AGREGAR;
                        comando += ObtenerControl("txtNombreAgregar").Text.PadLeft(15, '0');
                        comando += ObtenerControl("txtIPAgregar").Text.PadLeft(15, '0');
                        comando += ObtenerControl("txtPuertoAgregar").Text.PadLeft(5, '0');
                        break;
                    }
                case CMD_QUITAR:
                    {
                        comando += CMD_QUITAR;
                        comando += ObtenerControl("txtIpQuitar").Text.PadLeft(15, '0');
                        comando += ObtenerControl("txtPuertoQuitar").Text.PadLeft(5, '0');
                        break;
                    }
            }
            return comando;
        }

        private Control ObtenerControl(string cmd)
        {
            Control[] controles = ventana.Controls.Find(cmd, true);

            return controles[0];
        }

    }
}
